Python project template - unittest
tests using pytest
Table of Content
Install and Setup#
- Add
pytesttorequirements-dev.txt - Run
pip install -r requirements-dev.txtagain - Create
testssub folder under root project folder - Add tests modules files prefix with
test_ - Add function to modules start also with
test_prefix - Install project using
pip install -e . - Run
pytest
demo#
demp_proj project
py_template/
├── .vscode
├── py_template
| └── example.py
├── setup.cfg
├── setup.py
├── tests
| └── test_example.py
├── venv
├── requirements.txt
├── requirements-dev.txt
└── version.py
test_example.py
# import pytest
# from py_template import example
# """
# # Run only tests mark as foo
# python -m pytest -m foo
# """
# @pytest.mark.foo
# def test_foo() -> None:
# result = example.foo()
# assert result is True
# @pytest.mark.foo
# def test_foo_with_assert_description() -> None:
# result = example.foo()
# assert result is True, "assert description"
# def test_bar() -> None:
# result = example.bar(1)
# assert result == 2.0
# def test_bar_with_exception() -> None:
# with pytest.raises(ZeroDivisionError):
# example.bar(0)
# def test_bar_with_exception_II() -> None:
# """
# catch general exception
# check exception type with assert
# """
# with pytest.raises(Exception) as e:
# example.bar(0)
# assert e.type == ZeroDivisionError
example.py
from queue import Queue
import logging
import threading
import time
from collections import deque
from threading import Event
log = logging.getLogger(__name__)
logging.basicConfig(
level=logging.INFO, format="[%(asctime)s] [%(name)s] %(levelname)s - %(message)s", datefmt='%H:%M:%S'
)
# some_queue: Queue = Queue(1)
some_queue: deque = deque(maxlen=1)
sync_event = Event()
def pub() -> None:
counter = 0
while True:
try:
some_queue.append(counter)
sync_event.set()
sync_event.clear()
time.sleep(1 / 5)
counter += 1
except Exception:
pass
def sub() -> None:
while True:
try:
sync_event.wait()
data = some_queue.popleft()
# sync_event.clear()
if data % 2:
raise Exception("odd exception")
log.info(data)
except Exception:
pass
# log.warning("Exception handling", exc_info=True)
# time.sleep(1)
if __name__ == "__main__":
t1 = threading.Thread(target=pub)
t2 = threading.Thread(target=sub)
t1.start()
t2.start()
t1.join()
t2.join()